### general options
Sys.setenv(LANG = "en")
options("scipen" = 100, "digits" = 4) # override R's tendency to use scientific notation
### Clean workspace
rm(list=ls())
graphics.off()
### Load packages (maybe need to be installed first)
# Standard
library(tidyverse) # General DS toolkit
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.4.0 ✔ purrr 1.0.1
✔ tibble 3.1.8 ✔ dplyr 1.0.10
✔ tidyr 1.2.1 ✔ stringr 1.5.0
✔ readr 2.1.3 ✔ forcats 0.5.2 ── Conflicts ───────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
library(magrittr) # For advanced piping
Attaching package: ‘magrittr’
The following object is masked from ‘package:purrr’:
set_names
The following object is masked from ‘package:tidyr’:
extract
# Databases
library(DBI) # GEneral R database interface
library(RPostgres) # PostgreSQL interface driver
library(dbplyr) # for dplyr with databases
Attaching package: ‘dbplyr’
The following objects are masked from ‘package:dplyr’:
ident, sql
# networks
library(tidygraph)
Attaching package: ‘tidygraph’
The following object is masked from ‘package:stats’:
filter
library(ggraph)
library(ggrepel)
# GEoplot
library(giscoR)
library(sf)
Linking to GEOS 3.10.2, GDAL 3.4.2, PROJ 8.2.1; sf_use_s2() is TRUE
## LOAD DATA
# Regular tables
data_appln <- read_rds('../temp/data_appln.rds')
data_pers_appln <- read_rds('../temp/data_pers_appln.rds')
data_nace2 <- read_rds('../temp/data_nace2.rds')
data_docdb_fam_cpc <- read_rds('../temp/data_docdb_fam_cpc.rds')
#data_person <- read_rds('../temp/data_person.rds')
# Regional specialization
region_RTA <- read_rds('../temp/region_RTA.rds') %>%
mutate(country = nuts %>% str_sub(1,2),
nuts_period = paste(nuts, 'P', period))
region_tech <- read_rds('../temp/region_tech.rds') %>%
mutate(country = nuts %>% str_sub(1,2),
nuts_period = paste(nuts, 'P', period))
# Technology space
g_tech <- read_rds('../temp/g_tech.rds')
# Lists
list_nace2 <- read_rds('../temp/list_nace2.rds')
# Applicants
region_applt_appln <- read_rds('../temp/tbl_region_applt_appln.rds') %>% select(-applt_seq_nr, -invt_seq_nr)
region_applt <- read_rds('../temp/tbl_region_applt.rds')
## Defining parameters
n_cutoff = 50
n_cutoff_green = 25
## SELECT FOCUS REGIONS
reg_in = '' # c('SE232', 'NO043', 'DK012')
n_regions = 4
# Restrict to top N regions
select_region <- region_tech %>%
group_by(country, nuts) %>%
summarise(n = sum(weight_frac, na.rm = TRUE),
n_Y = sum(weight_frac * Y_tag, na.rm = TRUE)) %>%
ungroup() %>%
group_by(country) %>%
arrange(desc(n_Y)) %>%
mutate(index = 1:n()) %>%
ungroup() %>%
filter(index <= n_regions | nuts %in% reg_in) %>%
distinct(nuts) %>%
pull(nuts)
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
rm(reg_in)
# Createdataframe with technology relatedness edgelist
tech_rel <- g_tech %E>%
mutate(from_nace = .N()$name[from],
to_nace = .N()$name[to]) %>%
as_tibble() %>%
mutate(from = from_nace %>% as.character(),
to = to_nace %>% as.character()) %>%
arrange(from, to) %>%
select(from, to, weight)
tech_rel %<>%
# Add opposite direction
bind_rows(tech_rel %>%
rename(from_new = to, to_new = from) %>%
rename(from = from_new, to = to_new) %>%
relocate(from, to)) %>%
# Add self loops
bind_rows(tech_rel %>%
distinct(from) %>%
mutate(to = from,
weight = 1)) %>%
distinct(from, to, .keep_all = TRUE)
# Summarize Regions
region_RTA_agg <- region_RTA %>%
group_by(country, nuts, period, nuts_period, Y_tag) %>%
summarise(n_spec = rta_bin %>% sum(na.rm = TRUE),
n_spec_count = (n_tech_region * rta_bin) %>% sum(na.rm = TRUE),
HHI = sum((n_tech_region/sum(n_tech_region) * 100)^2) ) %>%
ungroup()
`summarise()` has grouped output by 'country', 'nuts', 'period', 'nuts_period'. You can override using the `.groups` argument.
# Dataframe with regions and technology fields
tech_dev <- region_RTA %>%
select(country, period, nuts, nuts_period, nace_group, Y_tag, n_tech_region, rta, rta_bin) %>%
arrange(country, nuts, nace_group, Y_tag, period) %>%
group_by(country, nuts, nace_group, Y_tag) %>%
mutate(n_tech_region_lag = lag(n_tech_region, 1),
n_tech_region_delta = n_tech_region - n_tech_region_lag,
pct_tech_region_delta = (n_tech_region - n_tech_region_lag) / ( n_tech_region_lag + 1),
rta_lag = lag(rta, 1),
rta_delta = rta - rta_lag,
rta_bin_lag = lag(rta_bin, 1),
rta_bin_delta = rta_bin - rta_bin_lag) %>%
ungroup() %>%
arrange(country, nuts, nace_group, Y_tag, period)
data_appln %>%
filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
count(appln_filing_year, Y_tag) %>%
ggplot(aes(x = appln_filing_year, y = n, col = Y_tag)) +
geom_line(key_glyph = "timeseries") +
labs(title = 'Patent applications: Development',
subtitle = 'All Nordic contries, by Y tag',
x = 'Year',
y = 'Number applications',
col = 'Green')
data_pers_appln %>%
filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
filter(nuts %in% select_region) %>%
count(appln_filing_year, nuts, Y_tag, wt = weight_frac) %>%
ggplot(aes(x = appln_filing_year, y = n, col = nuts)) +
geom_line(key_glyph = "timeseries") +
facet_wrap(vars(Y_tag), scales = 'free') +
labs(title = 'Patent applications: Development',
subtitle = 'All Nordic contries',
x = 'Year',
y = 'Number applications, by region and Y tag',
col = 'Nuts3')
data_pers_appln %>%
filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
count(appln_filing_year, person_ctry_code, Y_tag, wt = weight_frac) %>%
ggplot(aes(x = appln_filing_year, y = n, col = person_ctry_code)) +
geom_line(key_glyph = "timeseries") +
facet_wrap(vars(Y_tag), scales = 'free') +
labs(title = 'Patent applications: Development by country',
subtitle = 'All Nordic contries',
x = 'Year',
y = 'Number applications, by region and Y tag',
col = 'Country')
region_applt_appln %<>%
group_by(appln_id) %>%
mutate(n_frac = 1 / n()) %>%
ungroup() %>%
left_join(region_applt %>% select(person_id, han_id, han_name, person_ctry_code, nuts), by = 'person_id') %>%
left_join(data_appln %>% select(appln_id, docdb_family_id, appln_filing_year, period, Y_tag), by = 'appln_id') %>%
left_join(data_nace2 %>% select(appln_id, nace_group) %>% group_by(appln_id) %>% mutate(nace_share = 1 / n()) %>% ungroup() %>% nest(nace = c(nace_group, nace_share)), by = 'appln_id') %>%
drop_na()
# List main applicants
applt_stats <- region_applt_appln %>%
group_by(han_id, han_name) %>%
summarise(
n_pat = sum(n_frac),
n_Y = sum(n_frac * Y_tag),
first_pat = min(appln_filing_year)
) %>%
mutate(share_Y = n_Y / n_pat,
age = 2016 - first_pat,
incumbant = age >= 10 & n_pat >= 10) %>%
ungroup() %>%
arrange(desc(n_pat))
`summarise()` has grouped output by 'han_id'. You can override using the `.groups` argument.
applt_stats %>% head(200)
applt_stats %>% arrange(desc(n_Y)) %>% head(100)
data_docdb_fam_cpc %>%
filter(Y_tag == TRUE) %>%
mutate(cpc_class_symbol = cpc_class_symbol %>% str_sub(1,4)) %>%
count(cpc_class_symbol, sort = TRUE)
set.seed(1337)
coords_tech <- g_tech %>% igraph::layout.fruchterman.reingold() %>% as_tibble()
Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
Using compatibility `.name_repair`.
colnames(coords_tech) <- c("x", "y")
g_tech %N>%
mutate(nace_group_name = nace_group_name %>% str_trunc(50, side = 'right')) %>%
ggraph(layout = coords_tech) +
geom_edge_link(aes(width = weight, alpha = weight), colour = "grey") +
geom_node_point(aes(colour = nace_sec_name, size = dgr)) +
geom_node_text(aes(label = nace_group_name, size = dgr, filter = percent_rank(dgr) >= 0.75 ), repel = TRUE) +
theme_void() +
theme(legend.position="bottom") +
labs(title = 'Industry Space (all Nordics)',
subtitle = 'Nodes = NACE 2 Industries. Edges: Relatedness')
p1 <- region_RTA_agg %>%
filter(nuts %in% select_region) %>%
pivot_wider(names_from = Y_tag, values_from = c(n_spec, n_spec_count, HHI), values_fill = 0, names_prefix = 'Y_tag_')
p2 <- p1 %>%
select(period, nuts, n_spec_Y_tag_FALSE, n_spec_Y_tag_TRUE) %>%
pivot_wider(names_from = period, values_from = c(n_spec_Y_tag_FALSE, n_spec_Y_tag_TRUE))
p1 %>%
ggplot(aes(x = n_spec_Y_tag_FALSE, y = n_spec_Y_tag_TRUE)) +
geom_segment(data = p2,
aes(x = n_spec_Y_tag_FALSE_1,
y = n_spec_Y_tag_TRUE_1,
xend = n_spec_Y_tag_FALSE_2,
yend = n_spec_Y_tag_TRUE_2,
size = 0.75),
alpha = 0.15,
arrow = arrow(length = unit(0.5, "cm"), type = "closed"),
show.legend = FALSE) +
geom_point(aes(size = n_spec_count_Y_tag_TRUE, col = HHI_Y_tag_TRUE)) +
geom_text_repel(aes(label = nuts), box.padding = 0.5, max.overlaps = Inf) +
scale_color_gradient2(low = "skyblue", mid = 'yellow', high = "red", midpoint = 1) +
scale_size(range = c(2, 10)) +
labs(title = 'Development of new regional specializations',
subtitle = 'By number of green and non green specializations in period 1 and 2',
note = '',
x = 'N non-green specializations',
y = 'N green specializations',
size = 'N green patents',
col = 'HHI green patents')
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.
rm(p1, p2)
tech_rel_dev <- tech_rel %>%
select(from, to, weight) %>%
left_join(tech_dev %>% distinct(nace_group, nuts), by = c('from' = 'nace_group')) %>%
# filter for rta in period 1
inner_join(tech_dev %>% filter(period == '1', rta_bin == 1) %>% select(nace_group, nuts, Y_tag), by = c('to' = 'nace_group', 'nuts')) %>%
# filter for new green specialization in period 2
semi_join(tech_dev %>% filter(period == '2', rta_bin == 1, rta_bin_delta == 1, Y_tag == TRUE), by = c('from' = 'nace_group', 'nuts')) %>%
rename(nace_group = from, related_techn = to)
p1 <- tech_rel_dev %>%
group_by(nuts, nace_group, Y_tag) %>%
summarise(rel_max = weight %>% max(),
rel_sum = weight %>% sum(),
rel_mean = weight %>% mean()) %>%
ungroup() %>%
#
group_by(nuts, Y_tag) %>%
summarise(rel = rel_max %>% mean()) %>%
ungroup() %>%
#
pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
left_join(tech_dev %>% filter(Y_tag == TRUE, period == '2', rta_bin == 1) %>% select(nuts , n_tech_region) %>% count(nuts, wt = n_tech_region), by = c('nuts')) %>%
mutate(country = nuts %>% str_sub(1,2))
`summarise()` has grouped output by 'nuts', 'nace_group'. You can override using the `.groups` argument.`summarise()` has grouped output by 'nuts'. You can override using the `.groups` argument.
x_mid <- mean(p1$Y_FALSE, na.rm = TRUE)
y_mid <- mean(p1$Y_TRUE, na.rm = TRUE)
p1 %>%
filter(0.5 <= percent_rank(n)) %>%
ggplot(aes(x = Y_FALSE, y = Y_TRUE, size = n)) +
geom_vline(xintercept = x_mid, linetype = "dashed", color = 'grey') +
geom_hline(yintercept = y_mid, linetype = "dashed", color = 'grey') +
geom_point(aes(col = country)) +
geom_text_repel(aes(label = nuts), box.padding = 0.5, max.overlaps = Inf) +
theme(legend.position="bottom") +
labs(title = 'New green specialization period 2',
subtitle = 'By nuts regions',
note = 'Relatedness is the mean over all new green specializations, per green specialization largest relatedness to former specialization counted',
x = 'Relatedness non-green',
y = 'Relatedness green',
size = 'N green patents')
rm(p1, x_mid, y_mid)
library(regions)
data(nuts_changes)
list_nuts <- nuts_changes %>% select(code_2021, geo_name_2021)
colnames(list_nuts) <- c('nuts', 'nuts_name')
# TODO: Include NO names by hand
!!! MAke additio nal ploty including old green specializations
p1 <- tech_rel_dev %>%
filter(nuts %in% select_region) %>%
group_by(nuts, nace_group, Y_tag) %>%
summarise(rel = weight %>% max()) %>%
ungroup() %>%
pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
left_join(tech_dev %>%
filter(Y_tag == TRUE, period == '2', rta_bin_delta == 1) %>%
count(nuts, nace_group, wt = n_tech_region),
by = c('nuts', 'nace_group')) %>%
mutate(country = nuts %>% str_sub(1,2)) %>%
left_join(list_nace2 %>%select(nace_group, nace_sec_name) %>% distinct(), by = 'nace_group') %>%
left_join(list_nuts %>% distinct(), by = 'nuts') %>% mutate(nuts_name = paste(nuts, nuts_name, sep = ': ') )
`summarise()` has grouped output by 'nuts', 'nace_group'. You can override using the `.groups` argument.
x_mid <- mean(p1$Y_FALSE, na.rm = TRUE)
y_mid <- mean(p1$Y_TRUE, na.rm = TRUE)
# plotting
p1 %>%
ggplot(aes(x = Y_FALSE, y = Y_TRUE, size = n, col = nace_sec_name)) +
geom_point() +
geom_text_repel(aes(label = nace_group), box.padding = 0.5) +
geom_vline(xintercept = x_mid, linetype = "dashed", color = 'grey') +
geom_hline(yintercept = y_mid, linetype = "dashed", color = 'grey') +
facet_wrap(vars(nuts_name), ncol = n_regions) +
theme(legend.position = 'bottom',
legend.box = "vertical") +
labs(title = 'New green specialization period 2',
subtitle = 'By nuts regions',
note = 'Relatedness is the mean over all new green specializations, per green specialization largest relatedness to former specialization counted',
x = 'Relatedness non-green',
y = 'Relatedness green',
col = 'NACE',
size = 'N green patents')
rm(p1, x_mid, y_mid)
path_green_new <- tech_rel_dev %>%
group_by(nuts, nace_group, Y_tag) %>%
summarise(rel = weight %>% max()) %>%
ungroup() %>%
pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
left_join(tech_dev %>%
filter(Y_tag == TRUE, period == '2', rta_bin_delta == 1) %>%
select(nuts, nace_group, n_tech_region) %>%
count(nuts, nace_group, wt = n_tech_region),
by = c('nuts', 'nace_group')) %>%
mutate(green_path = case_when(
Y_FALSE <= mean(Y_FALSE) & Y_TRUE <= mean(Y_TRUE) ~ 'creation',
Y_FALSE <= mean(Y_FALSE) & Y_TRUE > mean(Y_TRUE) ~ 'diversification',
Y_FALSE > mean(Y_FALSE) & Y_TRUE <= mean(Y_TRUE) ~ 'renewal',
Y_FALSE > mean(Y_FALSE) & Y_TRUE > mean(Y_TRUE) ~ 'renewal'
) ) %>%
select(-Y_FALSE, - Y_TRUE)
`summarise()` has grouped output by 'nuts', 'nace_group'. You can override using the `.groups` argument.
TODO: Increase text size
path_green <- tech_dev %>%
mutate(green_path = case_when(
Y_tag == TRUE & period == '2' & rta_bin == 1 & rta_bin_delta == 0 & pct_tech_region_delta < 0.1 ~ 'stagnation',
Y_tag == TRUE & period == '2' & rta_bin == 1 & rta_bin_delta == 0 & pct_tech_region_delta >= 0.1 ~ 'extension',
Y_tag == TRUE & period == '2' & rta_bin == 0 & rta_bin_delta == -1 ~ 'extinction'
)) %>%
drop_na(green_path) %>%
select(nuts, nace_group, n_tech_region_delta, green_path) %>%
rename(n = n_tech_region_delta) %>%
# add existing green paths
bind_rows(path_green_new) %>%
mutate(n = n %>% abs()) %>%
# add incumbant measures
left_join(region_techn_incumb %>% filter(period == '2', Y_tag == TRUE) %>% select(nuts, nace_group, share_inc), by = c('nuts', 'nace_group')) %>%
mutate(n_new = n * (1 - share_inc),
n_inc = n * share_inc)
Break down main path industry
path_green %>%
filter(nuts %in% select_region, green_path != 'stagnation') %>%
# split by inc and non_incumbents
pivot_longer(c(n_new, n_inc), names_to = 'applt_type') %>%
# Aggregate
count(nuts, green_path, applt_type, wt = value) %>%
complete(nuts, green_path, applt_type, fill = list('n' = 0)) %>%
# Add overall patents andf make share
left_join(region_RTA %>%filter(period == '2') %>% count(nuts, wt = n_region, name = 'n_reg'), by = 'nuts') %>%
mutate(n_share = n ) %>% #/ n_reg) %>%
left_join(list_nuts %>% distinct(), by = 'nuts') %>% mutate(nuts_name = paste(nuts, nuts_name, sep = ': ') ) %>%
# plotting
ggplot() +
geom_col(aes(x = green_path, y = n_share, fill = applt_type, col = green_path), alpha = 0.8, position= "stack") +
# Lollipop shaft
#geom_segment( aes(x = green_path, y = 0, xend = green_path, yend = 0.002), linetype = "dashed", color = "gray12") +
# coord_polar() +
# coord_flip() +
facet_wrap(vars(nuts_name), ncol = n_regions, scales = 'free') +
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust=1)) +
theme(legend.position = 'bottom',
legend.box = "vertical") +
labs(title = 'Regional green paths',
subtitle = 'By nuts regions',
note = 'xxxx',
x = NULL,
y = NULL,
size = 'Share green patents',
col = 'Green path type',
fill = 'Applicant type')
# See: https://ropengov.github.io/giscoR/
# Get map of nordics
map_nordic <- gisco_get_nuts(country = c('DNK', 'SWE', 'NOR', 'FIN'), nuts_level = 3, year = '2016')
# filter out Svalbart etc
map_nordic %<>%
filter(!(NUTS_ID %in% c('NO0B1', 'NO0B2')))
# Group by NUTS by country and convert to lines
country_lines <- map_nordic %>%
group_by(CNTR_CODE) %>%
summarise(n = n()) %>%
ungroup() %>%
st_cast("MULTILINESTRING")
All green paths
map_nordic %>%
# enter main green path
left_join(path_green %>% count(nuts, green_path, wt = n) %>% group_by(nuts) %>% slice_max(order_by = n, n = 1, with_ties = FALSE) %>% ungroup(), by = c('NUTS_ID' = 'nuts')) %>%
# plot
ggplot() +
geom_sf(aes(fill = green_path)) +
geom_sf(data = country_lines, col = "blue", linewidth = 0.1) +
theme_void() +
labs(title = 'Map: Nordic main green paths',
subtitle = 'By nuts regions',
note = 'Excluding NO0B1,NO0B2',
x = NULL,
y = NULL,
fill = 'Main green path') #+ theme(legend.position = 'bottom')
tab_1 <- tech_dev %>%
filter(period == 2) %>%
count(nuts, Y_tag, wt = n_tech_region) %>%
pivot_wider(names_from = Y_tag, values_from = n, values_fill = 0, names_prefix = 'Y_') %>%
mutate(Y_FALSE = round(Y_FALSE), Y_TRUE = round(Y_TRUE),
Y_share = (Y_TRUE / (Y_FALSE + Y_TRUE) ) %>% round(2) )
tab_1
tab_2 <- region_applt_appln %>%
filter(period == 2) %>%
count(nuts, han_name, han_id, Y_tag, wt = n_frac) %>%
pivot_wider(names_from = Y_tag, values_from = n, values_fill = 0, names_prefix = 'Y_') %>%
mutate(Y_FALSE = round(Y_FALSE), Y_TRUE = round(Y_TRUE),
Y_share = (Y_TRUE / (Y_FALSE + Y_TRUE) ) %>% round(2)) %>%
group_by(nuts) %>%
slice_max(order_by = Y_TRUE, n = 1, with_ties = FALSE) %>%
ungroup() %>%
left_join(applt_stats %>% select(han_id, incumbant) %>% mutate(incumbant = ifelse(incumbant == TRUE, 'incumb.', 'entrant')), by = 'han_id') %>%
mutate(applicant = paste0(han_name, ' (',incumbant ,', n green: ', Y_TRUE, ', share:', Y_share, ')')) %>%
select(nuts, applicant)
tab_2
tab_3 <- path_green %>%
count(nuts, green_path, wt = n) %>%
group_by(nuts) %>%
mutate(share = (n / sum(n)) %>% round(2) ) %>%
ungroup() %>%
select(-n) %>%
pivot_wider(names_from = green_path, values_from = share, names_prefix= '% path ', values_fill = 0) %>%
arrange(nuts)
tab_3
tab_all <- tab_1 %>%
left_join(tab_2, by = 'nuts') %>%
left_join(tab_3, by = 'nuts')
tab_all
library(stargazer)
tab_all %>% stargazer(summary = FALSE, type = 'html')
<table style="text-align:center"><tr><td colspan="12" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td>nuts</td><td>Y_FALSE</td><td>Y_TRUE</td><td>Y_share</td><td>applicant</td><td>% path creation</td><td>% path diversification</td><td>% path extension</td><td>% path extinction</td><td>% path renewal</td><td>% path stagnation</td></tr>
<tr><td colspan="12" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">1</td><td>DK011</td><td>751</td><td>66</td><td>0.08</td><td>DUPONT NUTRITION BIOSCIENCES APS (n green: 14, share:0.14)</td><td>0.18</td><td>0.2</td><td>0.48</td><td>0.12</td><td>0.02</td><td>0</td></tr>
<tr><td style="text-align:left">2</td><td>DK012</td><td>1126</td><td>64</td><td>0.05</td><td>NOVOZYMES AS (n green: 68, share:0.16)</td><td>0.15</td><td>0.15</td><td>0.42</td><td>0.26</td><td>0</td><td>0.02</td></tr>
<tr><td style="text-align:left">3</td><td>DK013</td><td>1273</td><td>92</td><td>0.07</td><td>VKR HOLDING AS (n green: 16, share:0.05)</td><td>0.25</td><td>0.21</td><td>0.46</td><td>0.02</td><td>0.06</td><td>0</td></tr>
<tr><td style="text-align:left">4</td><td>DK014</td><td>18</td><td>0</td><td>0</td><td>BORNHOLMS AS (n green: 0, share:0)</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td></tr>
<tr><td style="text-align:left">5</td><td>DK021</td><td>292</td><td>30</td><td>0.09</td><td>FORSKNINGSCENTER RISO (n green: 3, share:1)</td><td>0.05</td><td>0.37</td><td>0.03</td><td>0.12</td><td>0.41</td><td>0.02</td></tr>
<tr><td style="text-align:left">6</td><td>DK022</td><td>240</td><td>18</td><td>0.07</td><td>BLADENA APS (n green: 5, share:1)</td><td>0.14</td><td>0.26</td><td>0.37</td><td>0.17</td><td>0.03</td><td>0.02</td></tr>
<tr><td style="text-align:left">7</td><td>DK031</td><td>240</td><td>92</td><td>0.28</td><td>IRD FUEL CELLS AS (n green: 8, share:1)</td><td>0.14</td><td>0.03</td><td>0.18</td><td>0.06</td><td>0.59</td><td>0</td></tr>
<tr><td style="text-align:left">8</td><td>DK032</td><td>569</td><td>210</td><td>0.27</td><td>LM WP PATENT HOLDING AS (n green: 77, share:0.93)</td><td>0.02</td><td>0.01</td><td>0.82</td><td>0.01</td><td>0.15</td><td>0</td></tr>
<tr><td style="text-align:left">9</td><td>DK041</td><td>400</td><td>235</td><td>0.37</td><td>SIEMENS GAMESA RENEWABLE ENERGY AS (n green: 150, share:0.89)</td><td>0.04</td><td>0</td><td>0.8</td><td>0.02</td><td>0.13</td><td>0</td></tr>
<tr><td style="text-align:left">10</td><td>DK042</td><td>745</td><td>394</td><td>0.35</td><td>VESTAS WIND SYSTEMS AS (n green: 606, share:0.94)</td><td>0.04</td><td>0</td><td>0.91</td><td>0.01</td><td>0.04</td><td>0</td></tr>
<tr><td style="text-align:left">11</td><td>DK050</td><td>329</td><td>60</td><td>0.15</td><td>LIFTRA IP APS (n green: 3, share:1)</td><td>0.18</td><td>0</td><td>0.71</td><td>0.02</td><td>0.03</td><td>0.06</td></tr>
<tr><td style="text-align:left">12</td><td>FI193</td><td>176</td><td>12</td><td>0.06</td><td>ECOCAT LTD (n green: 6, share:0.46)</td><td>0.22</td><td>0.05</td><td>0.16</td><td>0.25</td><td>0.33</td><td>0</td></tr>
<tr><td style="text-align:left">13</td><td>FI194</td><td>46</td><td>2</td><td>0.04</td><td>RMV TECH LTD (n green: 2, share:1)</td><td>0.8</td><td>0</td><td>0</td><td>0</td><td>0.2</td><td>0</td></tr>
<tr><td style="text-align:left">14</td><td>FI195</td><td>259</td><td>77</td><td>0.23</td><td>WARTSILA FINLAND LTD (n green: 139, share:0.45)</td><td>0</td><td>0</td><td>0.81</td><td>0</td><td>0.19</td><td>0</td></tr>
<tr><td style="text-align:left">15</td><td>FI196</td><td>115</td><td>24</td><td>0.17</td><td>NORILSK NICKEL HARJAVALTA LTD (n green: 4, share:1)</td><td>0</td><td>0</td><td>0.82</td><td>0.08</td><td>0.09</td><td>0</td></tr>
<tr><td style="text-align:left">16</td><td>FI197</td><td>1198</td><td>65</td><td>0.05</td><td>SANDVIK MINING</td><td>CONSTRUCTION LTD (n green: 14, share:0.11)</td><td>0.03</td><td>0.45</td><td>0.43</td><td>0</td><td>0.03</td></tr>
<tr><td style="text-align:left">17</td><td>FI1B1</td><td>3860</td><td>296</td><td>0.07</td><td>NOKIA TECH LTD (n green: 109, share:0.07)</td><td>0</td><td>0.32</td><td>0.61</td><td>0.02</td><td>0.04</td><td>0.01</td></tr>
<tr><td style="text-align:left">18</td><td>FI1C1</td><td>650</td><td>44</td><td>0.06</td><td>OY LANGH TECH AB (n green: 3, share:1)</td><td>0.32</td><td>0.2</td><td>0.13</td><td>0.22</td><td>0.12</td><td>0</td></tr>
<tr><td style="text-align:left">19</td><td>FI1C2</td><td>103</td><td>4</td><td>0.04</td><td>EKOKEM PALVELU LTD (n green: 1, share:1)</td><td>0</td><td>0.34</td><td>0.2</td><td>0</td><td>0.46</td><td>0</td></tr>
<tr><td style="text-align:left">20</td><td>FI1C3</td><td>99</td><td>6</td><td>0.06</td><td>WATERBOX LTD (n green: 5, share:0.71)</td><td>0</td><td>0.26</td><td>0.17</td><td>0.46</td><td>0.11</td><td>0</td></tr>
<tr><td style="text-align:left">21</td><td>FI1C4</td><td>69</td><td>4</td><td>0.05</td><td>HALTON LTD (n green: 2, share:0.2)</td><td>0.42</td><td>0.14</td><td>0</td><td>0.36</td><td>0.08</td><td>0</td></tr>
<tr><td style="text-align:left">22</td><td>FI1C5</td><td>89</td><td>16</td><td>0.15</td><td>VISEDO LTD (n green: 11, share:0.61)</td><td>0.43</td><td>0.06</td><td>0</td><td>0.06</td><td>0.45</td><td>0</td></tr>
<tr><td style="text-align:left">23</td><td>FI1D1</td><td>39</td><td>2</td><td>0.05</td><td>SAVO SOLAR LTD (n green: 5, share:1)</td><td>0.8</td><td>0</td><td>0</td><td>0.2</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">24</td><td>FI1D2</td><td>88</td><td>5</td><td>0.05</td><td>PONSSE PLC (n green: 2, share:0.08)</td><td>0.33</td><td>0</td><td>0</td><td>0</td><td>0.67</td><td>0</td></tr>
<tr><td style="text-align:left">25</td><td>FI1D3</td><td>74</td><td>2</td><td>0.03</td><td>HOLJAKKA LTD (n green: 1, share:0.5)</td><td>0.65</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0.35</td></tr>
<tr><td style="text-align:left">26</td><td>FI1D4</td><td>16</td><td>0</td><td>0</td><td>MATTOASENNUS KARJALAINEN LTD (n green: 1, share:1)</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td><td>NA</td></tr>
<tr><td style="text-align:left">27</td><td>FI1D5</td><td>12</td><td>3</td><td>0.2</td><td>FREEPORT COBALT LTD (n green: 1, share:1)</td><td>0</td><td>0</td><td>0.45</td><td>0</td><td>0.55</td><td>0</td></tr>
<tr><td style="text-align:left">28</td><td>FI1D6</td><td>759</td><td>47</td><td>0.06</td><td>PROVENTIA EMISSION CONTROL LTD (n green: 3, share:0.6)</td><td>0</td><td>0.06</td><td>0.69</td><td>0.16</td><td>0.1</td><td>0</td></tr>
<tr><td style="text-align:left">29</td><td>FI1D7</td><td>26</td><td>3</td><td>0.1</td><td>SAVATERRA LTD (n green: 2, share:0.67)</td><td>0</td><td>0.6</td><td>0</td><td>0.15</td><td>0.25</td><td>0</td></tr>
<tr><td style="text-align:left">30</td><td>FI200</td><td>9</td><td>1</td><td>0.1</td><td>ASCE AB LTD (n green: 0, share:0)</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">31</td><td>NO011</td><td>453</td><td>29</td><td>0.06</td><td>NORSK HYDRO ASA (n green: 14, share:0.14)</td><td>0.16</td><td>0.04</td><td>0.02</td><td>0.37</td><td>0.37</td><td>0.02</td></tr>
<tr><td style="text-align:left">32</td><td>NO012</td><td>286</td><td>33</td><td>0.1</td><td>AKER ENGINEERING</td><td>TECH AS (n green: 11, share:0.69)</td><td>0.04</td><td>0.1</td><td>0.13</td><td>0.14</td><td>0.53</td></tr>
<tr><td style="text-align:left">33</td><td>NO021</td><td>24</td><td>2</td><td>0.08</td><td>ARBAFLAME TECH AS (n green: 2, share:1)</td><td>0.5</td><td>0.5</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">34</td><td>NO022</td><td>30</td><td>3</td><td>0.09</td><td>HEXAGON RAGASCO AS (n green: 2, share:1)</td><td>0.2</td><td>0</td><td>0</td><td>0</td><td>0.8</td><td>0</td></tr>
<tr><td style="text-align:left">35</td><td>NO031</td><td>61</td><td>10</td><td>0.14</td><td>BORREGAARD AS (n green: 3, share:0.25)</td><td>0.33</td><td>0</td><td>0.05</td><td>0.1</td><td>0.52</td><td>0</td></tr>
<tr><td style="text-align:left">36</td><td>NO032</td><td>116</td><td>6</td><td>0.05</td><td>ELTEK AS (n green: 5, share:0.71)</td><td>0.39</td><td>0.15</td><td>0.02</td><td>0.39</td><td>0.05</td><td>0</td></tr>
<tr><td style="text-align:left">37</td><td>NO033</td><td>93</td><td>5</td><td>0.05</td><td>ANOXKALDNES AS (n green: 2, share:1)</td><td>0.02</td><td>0.23</td><td>0</td><td>0.53</td><td>0.21</td><td>0</td></tr>
<tr><td style="text-align:left">38</td><td>NO034</td><td>133</td><td>13</td><td>0.09</td><td>EFD INDUCTION AS (n green: 1, share:1)</td><td>0.23</td><td>0</td><td>0.24</td><td>0</td><td>0.16</td><td>0.38</td></tr>
<tr><td style="text-align:left">39</td><td>NO041</td><td>43</td><td>5</td><td>0.1</td><td>FLUMILL AS (n green: 1, share:1)</td><td>0.18</td><td>0</td><td>0</td><td>0.13</td><td>0.69</td><td>0</td></tr>
<tr><td style="text-align:left">40</td><td>NO042</td><td>85</td><td>10</td><td>0.11</td><td>METALLKRAFT AS (n green: 3, share:1)</td><td>0.86</td><td>0</td><td>0</td><td>0.14</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">41</td><td>NO043</td><td>361</td><td>25</td><td>0.06</td><td>HYWIND AS (n green: 8, share:1)</td><td>0.01</td><td>0.05</td><td>0.35</td><td>0.16</td><td>0.42</td><td>0.01</td></tr>
<tr><td style="text-align:left">42</td><td>NO051</td><td>168</td><td>24</td><td>0.12</td><td>BERGEN TEKNOLOGIOVERFØRING AS (n green: 4, share:0.31)</td><td>0.18</td><td>0</td><td>0.25</td><td>0.11</td><td>0.46</td><td>0</td></tr>
<tr><td style="text-align:left">43</td><td>NO052</td><td>21</td><td>3</td><td>0.12</td><td>ECOMERDEN AS (n green: 2, share:1)</td><td>0</td><td>0.4</td><td>0</td><td>0.4</td><td>0.2</td><td>0</td></tr>
<tr><td style="text-align:left">44</td><td>NO053</td><td>104</td><td>14</td><td>0.12</td><td>SIRIUS TECH AS (n green: 4, share:1)</td><td>0.09</td><td>0</td><td>0</td><td>0.06</td><td>0.81</td><td>0.04</td></tr>
<tr><td style="text-align:left">45</td><td>NO061</td><td>214</td><td>31</td><td>0.13</td><td>SINVENT AS (n green: 5, share:0.13)</td><td>0.04</td><td>0.03</td><td>0.09</td><td>0.38</td><td>0.46</td><td>0</td></tr>
<tr><td style="text-align:left">46</td><td>NO062</td><td>14</td><td>5</td><td>0.26</td><td>DYNAVEC AS (n green: 1, share:1)</td><td>0.23</td><td>0.34</td><td>0</td><td>0.23</td><td>0.19</td><td>0</td></tr>
<tr><td style="text-align:left">47</td><td>NO071</td><td>19</td><td>4</td><td>0.17</td><td>AKER BIOMARINE ANTARCTIC AS (n green: 2, share:0.67)</td><td>0.12</td><td>0</td><td>0.88</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">48</td><td>NO072</td><td>32</td><td>5</td><td>0.14</td><td>HYDRA TIDAL ENERGY TECH AS (n green: 4, share:1)</td><td>0.8</td><td>0</td><td>0</td><td>0</td><td>0.2</td><td>0</td></tr>
<tr><td style="text-align:left">49</td><td>NO073</td><td>1</td><td>0</td><td>0</td><td>HAMMERFEST STROM AS (n green: 2, share:1)</td><td>0</td><td>0.2</td><td>0</td><td>0.8</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">50</td><td>SE110</td><td>5903</td><td>386</td><td>0.06</td><td>TELEFON AB LM ERICSSON PUBL (n green: 476, share:0.06)</td><td>0</td><td>0.04</td><td>0.75</td><td>0.18</td><td>0.04</td><td>0</td></tr>
<tr><td style="text-align:left">51</td><td>SE121</td><td>673</td><td>27</td><td>0.04</td><td>SEABASED AB (n green: 3, share:1)</td><td>0.02</td><td>0.02</td><td>0.7</td><td>0.16</td><td>0.09</td><td>0.01</td></tr>
<tr><td style="text-align:left">52</td><td>SE122</td><td>246</td><td>12</td><td>0.05</td><td>VOLVO CONSTRUCTION EQUIPMENT AB (n green: 16, share:0.14)</td><td>0.11</td><td>0</td><td>0.43</td><td>0.35</td><td>0</td><td>0.12</td></tr>
<tr><td style="text-align:left">53</td><td>SE123</td><td>982</td><td>60</td><td>0.06</td><td>SAAB AB (n green: 24, share:0.07)</td><td>0.02</td><td>0</td><td>0.74</td><td>0.11</td><td>0.12</td><td>0</td></tr>
<tr><td style="text-align:left">54</td><td>SE124</td><td>177</td><td>2</td><td>0.01</td><td>CHEMATUR ENGINEERING AB (n green: 2, share:1)</td><td>0.26</td><td>0</td><td>0.06</td><td>0.68</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">55</td><td>SE125</td><td>477</td><td>95</td><td>0.17</td><td>WESTINGHOUSE ELECT SE AB (n green: 54, share:0.98)</td><td>0.02</td><td>0</td><td>0.05</td><td>0.06</td><td>0.46</td><td>0.41</td></tr>
<tr><td style="text-align:left">56</td><td>SE211</td><td>390</td><td>11</td><td>0.03</td><td>HUSQVARNA AB (n green: 37, share:0.16)</td><td>0.15</td><td>0.25</td><td>0.37</td><td>0.23</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">57</td><td>SE212</td><td>164</td><td>15</td><td>0.08</td><td>SODRA SKOGSAGARNA EKONOMISK FORENING (n green: 2, share:0.29)</td><td>0.4</td><td>0</td><td>0.5</td><td>0</td><td>0.1</td><td>0</td></tr>
<tr><td style="text-align:left">58</td><td>SE213</td><td>103</td><td>10</td><td>0.09</td><td>Jilken, Leif Anders (n green: 2, share:1)</td><td>0.15</td><td>0.39</td><td>0</td><td>0.31</td><td>0.15</td><td>0</td></tr>
<tr><td style="text-align:left">59</td><td>SE214</td><td>5</td><td>0</td><td>0</td><td>CEDERGRENS MEK VERKSTAD AB (n green: 0, share:0)</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">60</td><td>SE221</td><td>110</td><td>9</td><td>0.08</td><td>EMG ENERGIMONTAGEGRUPPEN AB (n green: 2, share:1)</td><td>0.7</td><td>0</td><td>0</td><td>0.04</td><td>0.24</td><td>0.02</td></tr>
<tr><td style="text-align:left">61</td><td>SE224</td><td>2924</td><td>179</td><td>0.06</td><td>ALFA LAVAL CORPORATE AB (n green: 20, share:0.07)</td><td>0.01</td><td>0.03</td><td>0.77</td><td>0.07</td><td>0.1</td><td>0.01</td></tr>
<tr><td style="text-align:left">62</td><td>SE231</td><td>314</td><td>23</td><td>0.07</td><td>AB HALMSTADS GUMMIFABRIK (n green: 1, share:1)</td><td>0.06</td><td>0.16</td><td>0.14</td><td>0.18</td><td>0.46</td><td>0</td></tr>
<tr><td style="text-align:left">63</td><td>SE232</td><td>2886</td><td>238</td><td>0.08</td><td>VOLVO LASTVAGNAR AB (n green: 96, share:0.23)</td><td>0.03</td><td>0.07</td><td>0.58</td><td>0.31</td><td>0.01</td><td>0.01</td></tr>
<tr><td style="text-align:left">64</td><td>SE311</td><td>215</td><td>16</td><td>0.07</td><td>ROLLS ROYCE AB (n green: 2, share:0.12)</td><td>0.08</td><td>0.18</td><td>0.09</td><td>0.19</td><td>0.33</td><td>0.12</td></tr>
<tr><td style="text-align:left">65</td><td>SE312</td><td>245</td><td>15</td><td>0.06</td><td>KASI TECH AB (n green: 5, share:1)</td><td>0.16</td><td>0</td><td>0.06</td><td>0.19</td><td>0.03</td><td>0.55</td></tr>
<tr><td style="text-align:left">66</td><td>SE313</td><td>342</td><td>4</td><td>0.01</td><td>SANDVIK INTELLECTUAL PROPERTY AB (n green: 12, share:0.02)</td><td>0.14</td><td>0.28</td><td>0.28</td><td>0.23</td><td>0</td><td>0.07</td></tr>
<tr><td style="text-align:left">67</td><td>SE321</td><td>130</td><td>5</td><td>0.04</td><td>VALMET AB (n green: 13, share:0.15)</td><td>0</td><td>0.3</td><td>0.04</td><td>0.61</td><td>0.05</td><td>0</td></tr>
<tr><td style="text-align:left">68</td><td>SE322</td><td>38</td><td>0</td><td>0</td><td>AARVAGS BARGNING</td><td>MEK AB (n green: 0, share:0)</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td style="text-align:left">69</td><td>SE331</td><td>136</td><td>12</td><td>0.08</td><td>BIOENDEV AB (n green: 7, share:1)</td><td>0.36</td><td>0.06</td><td>0</td><td>0.24</td><td>0.17</td><td>0.16</td></tr>
<tr><td style="text-align:left">70</td><td>SE332</td><td>303</td><td>22</td><td>0.07</td><td>SUNPINE AB (n green: 3, share:0.75)</td><td>0.03</td><td>0</td><td>0.77</td><td>0.2</td><td>0</td><td>0</td></tr>
<tr><td colspan="12" style="border-bottom: 1px solid black"></td></tr></table>
sessionInfo()
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Ventura 13.2.1
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] regions_0.1.8 sf_1.0-9 giscoR_0.3.2 ggrepel_0.9.1 ggraph_2.1.0 tidygraph_1.2.2 dbplyr_2.2.1 RPostgres_1.4.4 DBI_1.1.3 magrittr_2.0.3
[11] forcats_0.5.2 stringr_1.5.0 dplyr_1.0.10 purrr_1.0.1 readr_2.1.3 tidyr_1.2.1 tibble_3.1.8 ggplot2_3.4.0 tidyverse_1.3.2
loaded via a namespace (and not attached):
[1] fs_1.6.1 lubridate_1.8.0 bit64_4.0.5 httr_1.4.4 rprojroot_2.0.3 bslib_0.4.2 tools_4.2.1 backports_1.4.1
[9] utf8_1.2.2 R6_2.5.1 KernSmooth_2.23-20 colorspace_2.1-0 withr_2.5.0 tidyselect_1.2.0 gridExtra_2.3 bit_4.0.5
[17] compiler_4.2.1 cli_3.6.0 rvest_1.0.3 xml2_1.3.3 sass_0.4.5 labeling_0.4.2 scales_1.2.1 classInt_0.4-8
[25] proxy_0.4-27 digest_0.6.31 rmarkdown_2.20 pkgconfig_2.0.3 htmltools_0.5.4 fastmap_1.1.0 rlang_1.0.6 readxl_1.4.1
[33] rstudioapi_0.14 jquerylib_0.1.4 farver_2.1.1 generics_0.1.3 jsonlite_1.8.4 vroom_1.6.0 googlesheets4_1.0.1 s2_1.1.1
[41] Rcpp_1.0.10 munsell_0.5.0 fansi_1.0.3 viridis_0.6.2 lifecycle_1.0.3 stringi_1.7.12 yaml_2.3.7 MASS_7.3-57
[49] grid_4.2.1 blob_1.2.3 parallel_4.2.1 crayon_1.5.2 graphlayouts_0.8.3 haven_2.5.1 hms_1.1.2 knitr_1.42
[57] pillar_1.8.1 igraph_1.3.5 wk_0.7.1 reprex_2.0.2 glue_1.6.2 evaluate_0.20 modelr_0.1.9 vctrs_0.5.2
[65] tzdb_0.3.0 tweenr_2.0.2 cellranger_1.1.0 gtable_0.3.1 polyclip_1.10-4 assertthat_0.2.1 cachem_1.0.6 xfun_0.37
[73] ggforce_0.4.1 countrycode_1.4.0 broom_1.0.1 e1071_1.7-12 class_7.3-20 googledrive_2.0.0 viridisLite_0.4.1 gargle_1.2.1
[81] units_0.8-1 ellipsis_0.3.2 here_1.0.1
# plot_techspace_dev(g = g_tech, rta_df = tech_dev, region = 'DK013', layout_nw = coords_tech)
TODO: GO ON HERE AND DO BETTER DATAVIZ
# TEst for function development
g = g_tech
rta_df = tech_dev
dev_df = tech_rel_dev
region = 'DK013'
time = '2'
layout_nw = coords_tech
rta_df %<>%
filter(nuts == region, period == time, Y_tag == TRUE) %>%
select(nace_group, rta, n_tech_region)
dev_df %<>%
filter(nuts == region) %>%
group_by(nace_group) %>%
summarise(prev_nongreen = max(nace_group == related_techn, na.rm = TRUE) %>% as.logical()) %>%
ungroup() %>%
replace_na(list(prev_nongreen = FALSE)) %>%
select(nace_group, prev_nongreen)
g <- g %N>%
mutate(label = nace_group_name %>% str_trunc(50, side = 'right')) %>%
left_join(rta_df, by = c("name" = "nace_group")) %N>%
left_join(dev_df, by = c("name" = "nace_group"))
g %>%
ggraph(layout = coords_tech) +
geom_edge_link(aes(width = weight, alpha = weight), colour = "grey") +
geom_node_point(aes(colour = rta, shape = prev_nongreen, size = n_tech_region, filter = rta >= 1)) +
geom_node_text(aes(label = label, size = n_tech_region, filter = rta >= 1), repel = TRUE) +
scale_color_gradient2(low = "skyblue", mid = 'yellow', high = "red", midpoint = 1) +
theme_void() +
theme(legend.position="bottom") +
labs(title = paste("Industry Space:", region, sep = " "),
subtitle = 'Nodes = NACE 2 Industries. Edges: Relatedness',
caption = '')
—>